#include "Semantico.h"

Semantico::Semantico(NoArvore &mArvoreSintatica , HashIdentificadores & mHashVariaveis)
{
	// recebe a arvore sintatica da analise sintatica
	this->mArvoreSintatica = &mArvoreSintatica;
	this->mHashVariaveis = &mHashVariaveis;
	ProcuraExpressao(this->mArvoreSintatica);
}

//operandos de uma expressão devem ser compatíveis com o operador.
void Semantico::ProcuraExpressao(NoArvore *mPai)
{
	// recebe os filhos do pai
	vector<NoArvore*> mFilhos = mPai->GetFilhos();
	
	
	// analisa cada filho
	for(int i = 0 ; i < mFilhos.size() ;	 i++)
	{
		//se existir EXPRESSAO deve-se tratar
		if((mFilhos.at(i)->mostra().compare("EXPRESSAO")) == 0)
		{
			// analisa compatibilidade de operadores
			Operadores(mFilhos.at(i));
			
			// nao eh necessario procurar novamente abaixo do EXPRESSAO
			continue;
		}
		
		ProcuraExpressao(mFilhos.at(i));
	}
	cout<<endl;
}


// os fatores presentes numa  EXPRESSAO devem ser sempre do mesmo tipo
// ou todos INTEGER ou todos BOOLEAN
//
void Semantico::Operadores(NoArvore *mPai)
{
	
	// recebe os filhos do pai
	vector<NoArvore*> mFilhos = mPai->GetFilhos();
	
	
	// analisa cada filho
	for(int i = 0 ; i < mFilhos.size() ;	 i++)
	{
		//se for um terminal deve-se ver o tipo
		if(mFilhos.at(i)->GetTerminal() == true )
		{
			//NoArvore* mNo = mFilhos.at(i);
			//pesquisar por nome
			//this->mHashVariaveis->Pesquisa()
			//retornar o tipo
			// fazer compararacao entre os tipos
			//se diferirem da erro	
		}
		
		Operadores(mFilhos.at(i));
	}
	
	
	
}

Semantico::~Semantico()
{
}
